#ifndef _AFFICHAGE
#define _AFFICHAGE

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>

#include "arbre.hpp"
#include "noeud.hpp"

using namespace std;

struct affichage {
    vector<string> niveau;
};

/*
    Pour toutes ces fonctions, la variable verbose permet d'afficher des information supplémentaires
    lors de l'éxecution, principalement utiles au débuggage
*/

void initAffichage (affichage &aff, unsigned int nb_niveaux = 3, bool verbose = false);
/* initialisation de la structure d'affichage
    précondition :  aff non initialisé
                    nb_niveaux un nombre de niveaux à réserver en mémoire
    postcondition : aff intialisé */

void ajoutNiveau (affichage &aff, string chaine = "", bool verbose = false);
/* ajoute un niveau à aff contenant une string chaine */

void affichageHorizontal(const arbre &a);
/* affiche horizontalement l'arbre
    précondition :  a initialisé */

void affichageArbreVertical(const arbre &a, bool verbose = false);
/* affiche verticalement l'arbre
    précondition :  a initialisé */

affichage remplirAff (const noeud &n, bool verbose = false);
/* construit récursivement la structure d'affichage
    précondition :  n initialisé */

void remplirChaine (affichage &aff, const elt element, const e_type type, unsigned int niveau, bool verbose = false);
/* ajoute l'élement du type passé en paramètre à la structure 'affichage passé en paramètre
    préconditions : aff initialisé
*/

void remplirOperateur (affichage &aff, const operateur op, unsigned int niveau, bool verbose = false);
/* ajoute l'élement de type opérateur à la structure 'affichage passé en paramètre
    préconditions : aff initialisé
*/

void remplirValeur (affichage &aff, const int valeur, unsigned int niveau, bool verbose = false);
/* ajoute la valeur passé en paramètre à la structure 'affichage passé en paramètre
    préconditions : aff initialisé
*/

void afficher(affichage &aff);
/* affiche la structure d'affichage
    précondition : aff initialisé */

void testamentAffichage(affichage &aff);
/* libére la struture d'affichage
    précondition : aff initialisé */

#endif
